﻿

#include "zyIPAddress.h"


DarkMoonUI::zyIPAddress::zyIPAddress()
{
	SetMember(L"this", (LONG_PTR)this);
	m_obj->setChildWndProc(zyIPAddress_ChildWndProc);
}
DarkMoonUI::zyIPAddress::~zyIPAddress()
{

}

LRESULT WINAPI DarkMoonUI::zyIPAddress::zyIPAddress_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle)
{
	if (message == WM_NOTIFY) {
		NMHDR nm;
		memmove(&nm, (void*)lParam, sizeof(nm));
		if (nm.code == IPN_FIELDCHANGED) {
			TRegEvent* evtPtr = (TRegEvent*)obj->getRegEvent(L"OnFieldChanged");
			if (evtPtr != nullptr) {
				NMIPADDRESS* nmip(reinterpret_cast<NMIPADDRESS*>(lParam));
				evtPtr->handler<int>(nm.hwndFrom, nmip->iField, nmip->iValue);

			}
		}
	}
	return zyCtrol::zyCtrol_ChildWndProc(obj, hWnd, message, wParam, lParam, bHandle);
}
BOOL DarkMoonUI::zyIPAddress::创建(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_窗口风格 == 0)
		参数_窗口风格 = WS_TABSTOP;
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	if (参数_窗口风格 == 0)
		参数_扩展风格 = WS_EX_CLIENTEDGE;
	return _CreateCtrol(参数_父窗口, 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格, 参数_扩展风格, L"SysIPAddress32");
}

BOOL DarkMoonUI::zyIPAddress::创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_窗口风格 == 0)
		参数_窗口风格 = WS_TABSTOP;
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	if (参数_窗口风格 == 0)
		参数_扩展风格 = WS_EX_CLIENTEDGE;
	return _CreateCtrol(参数_父窗口.getHwnd(), 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格, 参数_扩展风格, L"SysIPAddress32");
}
UINT DarkMoonUI::zyIPAddress::_IP地址到整数(黑月IP地址& 参数_地址) {
	uint32_t address =
		(static_cast<uint32_t>(参数_地址.A段) << 24) |
		(static_cast<uint32_t>(参数_地址.B段) << 16) |
		(static_cast<uint32_t>(参数_地址.C段) << 8) |
		static_cast<uint32_t>(参数_地址.D段);
	return address;
}
DarkMoonUI::黑月IP地址 DarkMoonUI::zyIPAddress::_整数到IP地址(int address) {
	short L = LOWORD(address);
	short H = HIWORD(address);
	黑月IP地址 局部_地址 = { 0 };
	局部_地址.A段 = HIBYTE(H);
	局部_地址.B段 = LOBYTE(H);
	局部_地址.C段 = HIBYTE(L);
	局部_地址.D段 = LOBYTE(L);
	return 局部_地址;
}
std::wstring DarkMoonUI::zyIPAddress::_IP地址到文本(黑月IP地址& 参数_IP地址) {
	std::wstring buffer;
	buffer.reserve(32);
	// 使用swprintf将IP地址的四个段格式化为文本  
	swprintf(&buffer[0], 32, L"%d.%d.%d.%d", 参数_IP地址.A段, 参数_IP地址.B段, 参数_IP地址.C段, 参数_IP地址.D段);
	return buffer;
}
DarkMoonUI::黑月IP地址 DarkMoonUI::zyIPAddress::_文本到IP地址(const std::wstring& 参数_IP地址文本) {
	黑月IP地址 局部_地址 = {0};
	std::vector<std::wstring> 局部_IP地址分割;
	局部_IP地址分割 = splitString(参数_IP地址文本, L'.');
	if (局部_IP地址分割.size() == 4) {
		局部_地址.A段 = static_cast<BYTE>(_wtoi(局部_IP地址分割[0].c_str()));
		局部_地址.B段 = static_cast<BYTE>(_wtoi(局部_IP地址分割[1].c_str()));
		局部_地址.C段 = static_cast<BYTE>(_wtoi(局部_IP地址分割[2].c_str()));
		局部_地址.D段 = static_cast<BYTE>(_wtoi(局部_IP地址分割[3].c_str()));
	}
	return 局部_地址;
}
std::vector<std::wstring> DarkMoonUI::zyIPAddress::splitString(const std::wstring& str, wchar_t delimiter) {
	std::vector<std::wstring> result;
	std::wstring current;
	for (wchar_t ch : str) {
		if (ch == delimiter) {
			if (!current.empty()) {
				result.push_back(current);
				current.clear();
			}
		}
		else {
			current += ch;
		}
	}
	if (!current.empty()) {
		result.push_back(current);
	}
	return result;
}
DarkMoonUI::黑月IP地址 DarkMoonUI::zyIPAddress::取地址() {
	int 局部_地址 = 0;
	sendMsg(IPM_GETADDRESS, 0, (LPARAM)&局部_地址);
	return _整数到IP地址(局部_地址);
}
std::wstring DarkMoonUI::zyIPAddress::取地址文本() {
	int 局部_地址 = 0;
	sendMsg(IPM_GETADDRESS, 0, (LPARAM)&局部_地址);
	黑月IP地址 地址 = _整数到IP地址(局部_地址);
	return _IP地址到文本(地址);
}
bool DarkMoonUI::zyIPAddress::置地址文本(const std::wstring& 参数_IP地址文本) {//成功返回真，否则返回假
	黑月IP地址 地址 = _文本到IP地址(参数_IP地址文本);
	int 局部_地址 = _IP地址到整数(地址);
	return sendMsg(IPM_SETADDRESS, 0, 局部_地址) != 0;
}
bool DarkMoonUI::zyIPAddress::清空() {//成功返回真，否则返回假
	return sendMsg(IPM_CLEARADDRESS, 0, 0) != 0;
}
bool DarkMoonUI::zyIPAddress::是否空地址() {//返回真为空，假为非空。
	return sendMsg(IPM_ISBLANK, 0, 0) != 0;
}
bool DarkMoonUI::zyIPAddress::置焦点位置(int 参数_IP段位置) {//成功返回真，否则返回假
	return sendMsg(IPM_SETFOCUS, 参数_IP段位置, 0) != 0;
}
bool DarkMoonUI::zyIPAddress::置IP范围(int 参数_IP段位置, byte 参数_最低值, byte 参数_最高值) {//设置某IP段输入值的范围。成功返回真，否则返回假
	return sendMsg(IPM_SETRANGE, 参数_IP段位置, MAKELPARAM(参数_最低值, 参数_最高值)) != 0;
}
bool DarkMoonUI::zyIPAddress::置地址(黑月IP地址& 参数_地址) {
	//int address = MAKELPARAM (MERGE_LOW_BYTES (参数_地址.D段, 参数_地址.C段), MERGE_LOW_BYTES (参数_地址.B段, 参数_地址.A段));
	uint32_t address =
		(static_cast<uint32_t>(参数_地址.A段) << 24) |
		(static_cast<uint32_t>(参数_地址.B段) << 16) |
		(static_cast<uint32_t>(参数_地址.C段) << 8) |
		static_cast<uint32_t>(参数_地址.D段);
	return sendMsg(IPM_SETADDRESS, 0, address) != 0;

}